﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web.Mvc;
using PortalCurriculo.Domain;
using PortalCurriculo.MvcWebUI.Helpers;
using PortalCurriculo.MvcWebUI.Models;

namespace PortalCurriculo.MvcWebUI.Controllers
{
    public class DeficienciaProfissionalController : ControllerBase<DeficienciaProfissionalModel, DeficienciaProfissional>
    {
        public ActionResult MasterEdicao(int? idProfissional)
        {
            return PartialView(SelecionarDeficiencia(idProfissional));
        }

        private static IEnumerable<DeficienciaProfissionalModel> SelecionarDeficiencia(int? idProfissional)
        {
            var deficiencias = idProfissional == null || LoggedHelper.IsSameProfessional()
                                   ? ContextSession<Profissional>(SessionName.ProfissionalLogado).DeficienciaProfissionals.ToList()
                                   : new DeficienciaProfissional().SelecionarPorProfissional(idProfissional.Value);

            return new DeficienciaProfissionalModel().CriarViewModel(deficiencias);
        }

        [UserAuthorize(UserType = UserAuthorizeAttribute.UserTypes.PessoaFisica)]
        public override ActionResult Manter(int? id)
        {
            base.Manter(id);
            return PartialView();
        }

        public ActionResult ListarCaracteristicas(int idDeficiencia)
        {
            var caracteristicas = new CaracteristicaDeficiencia { IdDeficiencia = idDeficiencia }.SelecionarPorDeficiencia();
            return Json(new { success = true, caracteristicas = caracteristicas.Select(m => new { m.Id, m.Descricao }).ToJson() });
        }

        [UserAuthorize(UserType = UserAuthorizeAttribute.UserTypes.PessoaFisica)]
        public override ActionResult Manter(DeficienciaProfissionalModel model)
        {
            if (model.IdProfissional == 0)
            {
                var profissional = WebSession<Profissional>(SessionName.ProfissionalLogado);
                if (profissional != null)
                    model.IdProfissional = profissional.Id;    
            }

            if (model.Id == 0 && new DeficienciaProfissional().Existe(model.IdProfissional, model.IdCaracteristicaDeficiencia))
                throw new DuplicateNameException();

            base.Manter(model);

            return PartialView("Listar", SelecionarDeficiencia(model.IdProfissional));
        }

        [UserAuthorize(UserType = UserAuthorizeAttribute.UserTypes.Profissional)]
        public ActionResult Excluir(int id)
        {
            new DeficienciaProfissional().Delete<DeficienciaProfissional>(id);
            var profissional = WebSession<Profissional>(SessionName.ProfissionalLogado);

            return PartialView("Listar", SelecionarDeficiencia(profissional.Id));
        }

        public void PreencherViewBag(int? idCaracteristicaDeficiencia = null)
        {
            var deficiencias = new Deficiencia().SelectAllActive<Deficiencia>().OrderBy(m => m.Descricao);
            int idDeficiencia = idCaracteristicaDeficiencia.HasValue && idCaracteristicaDeficiencia > 0
                                    ? new CaracteristicaDeficiencia().SelectById<CaracteristicaDeficiencia>(idCaracteristicaDeficiencia.Value).IdDeficiencia
                                    : deficiencias.First().Id;

            ViewBag.IdDeficiencia = deficiencias.ToSelectList(x => x.Descricao, x => x.Id.ToString(), idDeficiencia.ToString());

            ViewBag.CaracteristicasDeficiencias =
                deficiencias.First(m => m.Id == idDeficiencia).CaracteristicaDeficiencias.ToSelectList(
                    x => x.Descricao, x => x.Id.ToString(), idCaracteristicaDeficiencia.ToString());
        }
    }
}
